/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Principal;

import Data.Jugador;
import Data.Nivel;
import Data.NodoCasilla;
import Data.NodoEspacio;
import Data.NodoEspecial;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 *
 * @author REI
 */
public class Tablero extends JPanel implements ActionListener{
    
    
    private Jugador jugador;
    private Timer tiempo;
    private Casilla[][] casillas;
    private Nivel nivel;
    private boolean jugando;
    private int ancho;
    private final int LARGO = 100;
    private boolean  adentro;
    

    public Tablero(Jugador jugador, Nivel nivel) {
        
        addKeyListener(new TAdapter());
        setBackground(Color.BLACK);
        setSize(800, 600);
        setFocusable(true);
        setDoubleBuffered(true);
        jugando = true;
        
        this.nivel = nivel;
        this.jugador = jugador;
        crearNivel();
        tiempo = new Timer(5, this);
        tiempo.start();
    }
    
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);

        if (jugando) 
        {
            Graphics2D g2d = (Graphics2D)g;

            dibujarNivel(g2d);

            crearInfo(g2d, g);
            

            if (jugador.isVisible())
                g2d.drawImage(jugador.getImagen(), jugador.getX(), jugador.getY(),
                              this);

            ArrayList<Magia> ms = jugador.getHechizos();

            for (int i = 0; i < ms.size(); i++) {
                Magia m = (Magia)ms.get(i);
                g2d.drawImage(m.getImagen(), m.getX(), m.getY(), this);
            }

        }

        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }
    
    
    private void crearInfo(Graphics2D g2d, Graphics g)
    {
            g2d.setColor(Color.BLACK);
            g2d.fillRect(0, 0,ancho,LARGO);

            g2d.setColor(Color.GREEN);
            g2d.fillRect(40,10, jugador.getVida(),10);

            g2d.setColor(Color.CYAN);
            g2d.fillRect(40,30, jugador.getMagia(),10);

            String msg = "vida";
            g.setColor(Color.white);
            g.drawString(msg,0, 20);

            String msg1 = "magia";
            g.setColor(Color.white);
            g.drawString(msg1,0, 40);
    }
    
    
    private void crearNivel()
    {
        int w = nivel.getAncho();
        int h = nivel.getAlto();
        Casilla casillaaux;
        int x =0;
        int y =0;
        int altoaux =0;
        String rutaimagen=null;

        NodoCasilla matriz[][] = nivel.getMatriz();
        
        casillas = new Casilla[w][h]; //iniciamos las casillas con el tamaño indicado        

        y = y + LARGO;

        for(int f =0;  f<w; f++)
        {
            x = 0;
            for(int c =0; c<h; c++)
            {
              rutaimagen = buscarImagenCasilla(matriz[f][c].getTipo());

              if(rutaimagen!=null)
              {
                  casillaaux = new Casilla(rutaimagen);
                  casillaaux.setLimite(x, y);
                  casillas[f][c]  = casillaaux;
                  x = x + casillaaux.getAncho();
                  altoaux = casillaaux.getAlto();
              }


            }

            y = y + altoaux;
        }

        ancho = x;
        jugador.setLimitex2(x);
        jugador.setLimitey2(y);
        

       
    }
    
    private void dibujarNivel(Graphics2D g2d)
    {
        int w = nivel.getAncho();
        int h = nivel.getAlto();
        Casilla casillaaux;
        int x =0;
        int y =0;
        int altoaux =0;            

        y = y + LARGO;

        for(int f =0;  f<w; f++)
        {
            x = 0;
            for(int c =0; c<h; c++)
            {
              
                  casillaaux = casillas[f][c];
                  g2d.drawImage(casillaaux.getImagen(), x, y, this);
                  x = x + casillaaux.getAncho();
                  altoaux = casillaaux.getAlto();
            }

            y = y + altoaux;
        }

             

       
    }
    
    
    private String buscarImagenCasilla(String nombre)
    {
        NodoEspacio espacioaux;
        String rutaImagen=null;

        espacioaux =nivel.buscarEspacio(nombre);

        if(espacioaux!=null)
        {
            rutaImagen = espacioaux.getImagen();
            return rutaImagen;
        }
        else
        {
            return rutaImagen;
        }

    }
    
    private void verificarColision()
    {
        int f=0;
        int c=0;
        int w = nivel.getAncho();
        int h = nivel.getAlto();
        Rectangle u1 = jugador.getUbicacion();
        Rectangle u2;
        Casilla aux;
        
        for(f=0;f<w;f++ )
        {
            for (c= 0; c < h; c++) {                
                
                aux = casillas[f][c];
                u2 = aux.getLimite();
                
                if(u1.intersects(u2))
                {
                       verificarPaso(f, c);
                        break; 
                }
                
            }
        }
        
        
    }
    
    
    private void verificarPaso(int f, int c)
    {
        NodoCasilla ubicacion = nivel.obtenerCasilla(f, c);
        NodoEspacio espacio = nivel.buscarEspacio(ubicacion.getTipo());
        
        if(espacio.getEspecial()!=null)
        {
            ArrayList<NodoEspecial> especial= espacio.getEspecial();
            
            for (NodoEspecial nodoEspecial : especial) {
                
                if(nodoEspecial.getNombre().compareTo("dano")==0)
                {
                    jugador.restarVida(nodoEspecial.getValor());
//                    nodoEspecial.setValor(0);
                    

                }
                else if(nodoEspecial.getNombre().compareTo("cura")==0)
                {
                    jugador.recuperarVida(nodoEspecial.getValor());
                    nodoEspecial.setValor(0);
                    
                }
                else if(nodoEspecial.getNombre().compareTo("magia")==0)
                {
                    jugador.recuperarMagia(nodoEspecial.getValor());
                    nodoEspecial.setValor(0);
                    
                }
                
            }
           
//            System.out.println("no se puede pasar");
        }
        else
        {
//            System.out.println("puede pasar");
        }
        
    }
    
    
    @Override
    public void actionPerformed(ActionEvent e) {
        
        ArrayList<Magia> ms = jugador.getHechizos();

            for (int i = 0; i < ms.size(); i++) {
                Magia m = (Magia)ms.get(i);
                
                if(m.isVisible())
                {
                    m.mover();
                }
                else
                {
                    ms.remove(i);
                }
            }

        jugador.mover();
        verificarColision();
        repaint();  
    }
    
    
    private class TAdapter extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            jugador.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            jugador.keyPressed(e);
        }
    }
    
}
